<?php
/**
 * 得到数组中的一个值.
 * @param $array
 * @param $key
 * @return mixed
 */
function get_array_value(&$array,$key, $prekey='')
{
    $result = $array[$key];
    if( !empty( $prekey ) )
    {
        return $result[ $prekey ];
    }
    return $result;
}

function get_url($controller,$method)
{
    $args = func_get_args();
    $argc = func_num_args();

    if ($controller)
    {
        $controller = strtolower($controller);
    }

    if ($method)
    {
        $method     = strtolower($method);
    }

    if ($argc === 0)
    {
        return '';
    }
    elseif($argc == 1)
    {
        return '/' . $controller;
    }
    elseif($argc == 2)
    {
        if ( $method == 'index' || !$method )
        {
            return '/' . $controller;
        }
        else
        {
            if ( $controller )
            {
                return '/' . $controller . '/' . $method;
            }
            else
            {
                return '/';
            }
        }
    }

    if ( $method == 'index' )
    {
        $url = '/' . $controller;
    }
    else
    {
        $url = '/' . $controller . '/' . $method . '';
    }

    array_shift($args);
    array_shift($args);

    $argc -= 2;

    foreach($args as &$arg)
    {
        list($k, $v) = explode('=', $arg, 2);
        if ( $v && (strlen($v) != strlen(utf8_decode($v))) ) $v = urlencode($v);
        if ( $v )
        {
            $arg = implode('=', array($k, $v));
        }
        else
        {
            $arg = $k;
        }
    }

    if ( !empty($args) )
    {
        $url .= '?' . implode('&',$args);
    }
    return $url;
}

function get_style($style,$v1='',$v2='')
{
    if ($v1 == $v2)
    {
        return ' class="' . $style . '"';
    }
}

function make_url($url,$name,$value)
{
    $pattern = "/([?|&]" . preg_quote($name) . "=)([^&]*)/i";

    if(preg_match($pattern,$url))
    {
        return preg_replace($pattern,"\$1".$value,$url);
    }
    else
    {
        if ( strlen($url) < 2 || !preg_match('/\?/', $url ))
        {
            return $url . '?' . $name . '=' . $value;
        }
        else
        {
            return $url . '&' . $name . '=' . $value;
        }
    }
}

function getOperation( $val, $num, $op="+" )
{
    switch( $op )
    {
        case "+":
            return $val + $num;
        case "-":
            return $val - $num;
        case "*":
            return $val * $num;
        case "/":
            if( $num != 0 )
            {
                return $val / $num;
            }
            return null;
    }
}

function get_thumb($filename)
{
    $name = explode('.',$filename);

    return $name[0] . '_s.jpg';
    //return substr_replace($filename,'_s',strrpos($filename,'.'),0);
}

function get_day_of_week()
{
    $now = time();
    $dow = strftime('%u', $now);
    return intval($dow);
}

/**
 * 获得当前页面 URL
 */
function current_url()
{
    global $in_var;

    $c = $in_var['c'];
    $d = $in_var['d'];

    static $trival_keys = array('c', 'd', 'IP_ADDRESS', 'request_method');

    $param_array = array($c, $d);
    foreach($in_var as $k=>$v)
    {
        if ( !$k || in_array($k, $trival_keys) ) continue;
        $param_array[] = "$k=$v";
    }

    return 'http://' . get_domain() . call_user_func_array(get_url, $param_array);
}

function plus($a, $b)
{
    return $a + $b;
}

function sub($x, $y)
{
    return $x - $y;
}

function mul($x, $y)
{
    return $x * $y;
}

function divide($x, $y)
{
    return $x / $y;
}

function get_domain()
{
    return $_SERVER['SERVER_NAME'];
}

/**
 * 通用时间格式化函数（目标是会返回类似“昨天 09:00 AM”这样的格式）
 * @param $timestamp
 * @param $type
 * @return string
 */
function get_time($timestamp, $type='long')
{
    if (!$timestamp)
    {
        return '';
    }

    $limit = time() - $timestamp;
    if ($type==='date' && $limit<86400)
    {
        return '今天';
    }
    if ($limit<60)
    {
        return '刚刚';
    }
    else if ($limit<3600)
    {
        return floor($limit/60) . '分钟前';
    }
    else if ($limit < 86400)
    {
        return floor($limit/3600) . '小时前';
    }
    else if ($limit<259200)
    {
        if ($type!='short')
        {
            $days = intval(floor($limit/86400));
            switch ($days)
            {
                case 1: return '昨天';
                case 2: return '前天';
            }
        }
    }
    else if ($limit<604800)
    {
    	$days = intval(floor($limit/86400));
    	
    	return $days . '天前';
    }
    else if ($limit<2419200)
    {
    	$week = intval(floor($limit/604800));
    	
    	return $week . '周前';
    }
    else if ($limit<3024000)
    {
    	$month = intval(floor($limit/2419200));
    	
    	return $month . '月前';
    }
    else if ($limit>3024000)
    {
    	return date('m-d', $timestamp);
    }

    switch ($type)
    {
        case 'short': return date('H:i:s', $timestamp);
        case 'date':  return date('Y-m-d', $timestamp);
        default:  return date('m-d', $timestamp);
    }
}

/**
 * 截止时间格式化函数
 * 输入一个截止时间戳，返回剩余的天、小时或者分数（如：2天、18小时29分、55分）
 * @param	time $timestamp	截止时间戳
 * @return	string
 */
function get_limit_time($timestamp)
{
	// 截止时间戳和当前时间戳的差值
	$sub_timestamp = $timestamp - time();
	
	// 如果截止时间戳小于当前的时间戳则返回fale
	if ($sub_timestamp < 0)
	{
		return false;
	}
	
	// 大于一天		显示格式：2天
	if ($sub_timestamp >= 86400)
	{
		return intval(floor($sub_timestamp/86400)).'天';
	}
	// 小于一天		显示格式：18小时29分
	elseif ($sub_timestamp >= 3600)
	{
		return intval(floor($sub_timestamp/3600)).'小时';
	}
	// 小于一个小时	显示格式：55分
	elseif ($sub_timestamp >= 60)
	{
		return intval(floor($sub_timestamp/60)).'分钟';
	}
	// 小于一分钟	显示格式：不到一分钟
	else 
	{
		return '不到一分钟';
	}
}

/**
 * 根据指定的数组内位置、行列大小等信息获取在表格中的坐标
 * @param $i                元素在数组中的索引(0..N)
 * @param $count_per_row    表格每行格子数
 * @param $grid_width       格子宽度
 * @param $grid_height      格子高度
 * @param $gap_x            格子间的横向间距
 * @param $gap_y            格子间的纵向间距
 * @return array
 */
function get_grid_coords($i, $count_per_row=4, $grid_width=100, $grid_height=30, $gap_x=22, $gap_y=11)
{
    // 计算元素位置
    $row_N    = intval($i/$count_per_row);
    $column_N = intval($i%$count_per_row);

    // 计算坐标
    $x = $gap_x + $column_N*($grid_width+$gap_x);
    $y = $gap_y + $row_N*($grid_height+$gap_y);

    return array(
       $x,
       $y,
       'x' => $x,
       'y' => $y,
    );
}

function if_then_else($var_for_testing, $true_value, $false_value)
{
    return $var_for_testing ? $true_value : $false_value;
}

function tpl_assign($key, $value)
{
    global $tpl;
    $tpl->tpl_vars[$key] = $value;
}

function tpl_unset($key)
{
    global $tpl;
    unset($tpl->tpl_vars[$key]);
}

function format_money($money)
{
    return @intval(divide($money, 100));
}
